package jp.kiroru_inc.rs_sample;

import android.content.res.Resources;
import android.graphics.BitmapFactory;
import android.renderscript.Allocation;
import android.renderscript.Float2;
import android.renderscript.ProgramFragment;
import android.renderscript.ProgramFragmentFixedFunction;
import android.renderscript.ProgramRaster;
import android.renderscript.ProgramStore;
import android.renderscript.RenderScriptGL;
import android.renderscript.Sampler;

/**
 * Java から RS へアクセスするためのクラスです。<br/>
 * <br/>
 * <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/">
 * <img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" />
 * </a><br/>
 * <span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">RSSample</span> by 
 * <a xmlns:cc="http://creativecommons.org/ns#" href="http://sakplus.jp/" property="cc:attributionName" rel="cc:attributionURL">
 * Selphy, Kiroru Inc.
 * </a>
 *  is licensed under a 
 * <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/">
 * Creative Commons 表示 - 非営利 - 継承 3.0 非移植 License
 * </a>.
 * @author selphy
 */
public class SampleScript {
	private static final int MODEL_COUNT = 3;
	
	private ScriptC_SampleScript script;
	private ProgramFragment progFragmentTexture;
	private ProgramStore progStoreBlendAlpha;
	
	// テクスチャー
	// 　青 -> ピンク -> 黄色　の順番
	private static int[] textureIds = new int[]{R.drawable.droid_blue, R.drawable.droid_pink, R.drawable.droid_yellow};
	
	/**
	 * RS の初期化を含むコンストラクタです。
	 * @param rs
	 * @param res
	 */
	protected SampleScript(RenderScriptGL rs, Resources res) {
		script = new ScriptC_SampleScript(rs, res, R.raw.samplescript);
		
		// 構造体の初期化
		// 　構造体内部にrs_allocationがあるので、そこにテクスチャーを設定する。
		ScriptField_RS_Droid droids = new ScriptField_RS_Droid(rs, MODEL_COUNT, Allocation.USAGE_GRAPHICS_TEXTURE);
		for (int i=0; i<MODEL_COUNT; i++) {
			ScriptField_RS_Droid.Item droid = new ScriptField_RS_Droid.Item();
			droid.texture = Allocation.createFromBitmap(rs, BitmapFactory.decodeResource(res, textureIds[i]));
			droids.set(droid, i, true);
		}
		script.bind_gDroids(droids);
		
		// ProgramStore
		// 　Alpha値を有効にする。
		progStoreBlendAlpha = ProgramStore.BLEND_ALPHA_DEPTH_TEST(rs);
		script.set_gProgStoreBlendAlpha(progStoreBlendAlpha);
		
		// テクスチャー用のFragment
		// 　Samplerを設定してテクスチャーのジャギーを目立たなくする。
		ProgramFragmentFixedFunction.Builder texBuilder = new ProgramFragmentFixedFunction.Builder(rs);
		texBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE, ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
		progFragmentTexture = texBuilder.create();
		progFragmentTexture.bindSampler(Sampler.CLAMP_LINEAR(rs), 0);
		script.set_gProgFragmentTexture(progFragmentTexture);
		
		// Raster
		// 　テクスチャーの表裏を描画する。
		script.set_gCullNone(ProgramRaster.CULL_NONE(rs));
		
		rs.bindRootScript(script);
	}
	
	/**
	 * タッチイベントから取得できるデータを RS に渡します。
	 * @param action
	 * @param x
	 * @param y
	 */
	protected void touchEvent(int action, float x, float y) {
		script.invoke_setTouchPosition(action, new Float2(x, y));
	}
}